/*
 * @Author: 火红色祥云 809880192@qq.com
 * @Date: 2023-12-26 15:35:11
 * @LastEditors: 火红色祥云 809880192@qq.com
 * @LastEditTime: 2023-12-26 16:55:38
 * @FilePath: /project_luckfox/iic/iic.cpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>

#define I2C_DEVICE_PATH "/dev/i2c-3"

int main() {
    uint8_t data[2] = {0x01,0x02};
    
    const char *i2c_device = I2C_DEVICE_PATH;  
    int i2c_file;

    if ((i2c_file = open(i2c_device, O_RDWR)) < 0) {
        perror("Failed to open I2C device");
        return -1;
    }
    /**
     * 这段代码使用 ioctl 函数来配置 I2C 通信。
     * 首先，通过 ioctl(i2c_file, I2C_TENBIT, 0) 设置了 I2C 总线为标准 7 位地址模式，
     * 而后，通过 ioctl(i2c_file, I2C_RETRIES, 5) 设置了 I2C 通信的重试次数为 5 次。
    */
    ioctl(i2c_file, I2C_TENBIT, 0);
    ioctl(i2c_file, I2C_RETRIES, 5);

    /**
     * 在这段代码中，首先，通过 ioctl(i2c_file, I2C_SLAVE, x) 将 I2C 从机地址设置为 x。
     * 接着使用 write 函数向 I2C 设备写入了一个包含 2 字节数据的数据块 data。
     * 如果成功写入了 2 字节数据，会打印该 I2C 设备的地址，表示数据已成功发送。
    */
    printf("i2cdetect addr : ");
    for (int x = 0; x < 0x7f; x++)
    {
        if (ioctl(i2c_file, I2C_SLAVE, x) < 0) {
            perror("Failed to set I2C slave address");
            close(i2c_file);
            return -1;
        }
        
        if (write(i2c_file, data, 2) == 2)
        {
            printf("0x%x,", x);
        }
    }
    
    close(i2c_file);
    printf("\r\n");

    return 0;
}